<?php

namespace App\Console\Commands;

use App\Http\Controllers\Admin\CommonController;
use App\Http\Controllers\ElasticsearchServiceController;
use App\Models\ResourceTotal;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;


/**
 * 同步所有数据到 ES
 */
class SyncEsData extends Command
{
    protected $data_sync_hour = 0; //0 表示不限制时间，全同步，其余表示 更改时间  单位小时
    protected $index_name = 'cqst_resource';

    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'command:SyncEsData';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '同步中文在线数据到ES';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        $hour = $this->data_sync_hour;
        $index_name = $this->index_name;

        // 获取 Elasticsearch 对象
        $es = new ElasticsearchServiceController();
        $resourceTotalModel = new ResourceTotal();
        $resourceTotalModel::query()
            // ->where('id', '>', 99)
            ->where(function ($query) use ($hour) {
                if ($hour) {
                    $query->where('change_time', '>', date('Y-m-d H:i:s', strtotime("-" . $hour . ' hours')));
                }
            })
            // 使用 chunkById 避免一次性加载过多数据
            ->chunkById(100, function ($data) use ($es, $index_name) {
                $start_msg = sprintf('正在同步 [ %s ] 表 ID 范围为 %s 至 %s 的数据', 'resource_total', $data->first()->id, $data->last()->id);
                //$this->info($start_msg); //$this->info() 输出信息到界面，跟echo 类似
                Log::channel('escmdlog')->debug($start_msg);
                $result_id = '';
                // 遍历商品
                foreach ($data as $i => $item) {

                    $param = [
                        'index' => $index_name,
                        'id' => $item->id,
                        'body' => [
                            'id' => $item->id,
                            'guid' => $item->guid,
                            'type_id' => $item->type_id,
                            'big_type_id' => $item->big_type_id,
                            'resource_business_id' => $item->resource_business_id,
                            'title' => $item->title,
                            'author' => $item->author,
                            'isbn' => $item->isbn,
                            'press' => $item->press,
                            'pre_time' => $item->pre_time,
                            'img' => $item->img,
                            'intro' => $item->intro,
                            'create_time' => str_replace(' ', 'T', $item->create_time->toArray()['formatted']) . 'Z', //$item->create_time  是一个对象  格式要求需要加 T  和 Z
                            'change_time' => str_replace(' ', 'T', $item->change_time->toArray()['formatted']) . 'Z',
                        ],
                    ];
                    try {
                        $is_exists = $es->esHasData($index_name, $item->guid);
                        if ($is_exists) {
                            //删除，ES 没有修改功能，都是删除
                            $es->esDataDelete($index_name, $item->id);
                        }

                        $es->getEsServiceObj()->index($param);
                    } catch (\Exception $e) {
                        //不处理报错
                        Log::channel('escmdlog')->debug('同步数据报错: ID-' . $item->id);
                        Log::channel('escmdlog')->debug($e->getMessage());
                    }

                    $result_id .= $item->id . '、';
                    trim($result_id);

                    // $param = [
                    //     'index' => 'ceshi5',
                    //     'id' => $item->id,
                    //     'body' => $item->toArray(),
                    // ];
                    // $datas[$i] = $param;
                }

                Log::channel('escmdlog')->debug('同步完成：' . $result_id);

                //  try {
                //      // 使用 bulk 方法批量创建
                //      $res = $es->bulk_doc2($datas, 'ceshi5');
                //  } catch (\Exception $e) {
                //      $this->error($e->getMessage());
                //      Log::channel('escmdlog')->debug($e->getMessage());
                //  }
                //  $this->info('同步完成' . $i);
            }, 'id');
        Log::channel('escmdlog')->debug('数据同步到ES完成');
    }
}
